﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.IO;
using Microsoft.DeepZoomTools;

namespace SmartMosaicServer.Upload
{
    public class FileUploader
    {
        private string INPUT_DIRECTORY =
            "C:\\SmartMosaicServer\\input";
            //"C:\\input";
        private string OUTPUT_DIRECTORY =
            "C:\\SmartMosaicServer\\output";
        private string DEEPZOOM_OUTPUT_DIRECTORY =
            "D:\\sourcecode\\codeplex\\SmartMosaic\\SmartMosaicServer\\UploadData";
        private string DEEPZOOM_URL =
            "http://211.189.20.163/SmartMosaicServer/UploadData/";

        private const string UPLOAD_FOLDER = "c:\\uploadfile\\";

        /// <summary>
        /// 이미지를 업로드 한 후 저장된 파일 경로를 반환한다.
        /// </summary>
        /// <param name="FileUp">업로드 컨트롤</param>
        /// <returns></returns>
        public string ImageUpload2(FileUpload FileUp, int themeCode)
        {
            string savedDir = "D:\\sourcecode\\codeplex\\SmartMosaic\\SmartMosaicServer\\UploadData\\index.txt";

            int USER_COUNT = 0;

            lock (GetType())
            {
                if (!File.Exists(savedDir))
                {
                    FileStream fs = File.Create(savedDir);

                    fs.Close();
                    fs.Dispose();
                }

                StreamReader sr = File.OpenText(savedDir);

                USER_COUNT = Convert.ToInt32(sr.ReadLine());
                USER_COUNT++;

                sr.Close();
                sr.Dispose();

                File.WriteAllText(savedDir, USER_COUNT.ToString());
            }

            // the byte array argument contains the content of the file
            // the string argument contains the name and extension
            // of the file passed in the byte array
                string newInputFileName = USER_COUNT + "" + themeCode + ".jpg";
                string newOutputFileName = USER_COUNT + ".jpg";
                string endOutputFileName = USER_COUNT + ".dat";

                FileUp.PostedFile.SaveAs(INPUT_DIRECTORY + "\\" + newInputFileName);

                //// instance a memory stream and pass the
                //// byte array to its constructor
                //MemoryStream ms = new MemoryStream(file);

                // instance a filestream pointing to the 
                // storage folder, use the original file name
                // to name the resulting file
                //FileStream fs = new FileStream
                //    (INPUT_DIRECTORY + "\\" + newInputFileName, FileMode.Create);

                // write the memory stream containing the original
                // file as a byte array to the filestream
                //ms.WriteTo(fs);

                //// clean up
                //ms.Close();
                //fs.Close();
                //fs.Dispose();

                // 여기서 파일 모니터하면 된다.
                while (!File.Exists(OUTPUT_DIRECTORY + "\\" + endOutputFileName))
                {
                    // 1초에 한번씩 체크
                    System.Threading.Thread.Sleep(1000);
                }

                // 파일이 생성된 경우
                // DeepZoomAPI 수행
                ImageCreator creator = new ImageCreator();
                creator.TileSize = 256;
                creator.TileFormat = Microsoft.DeepZoomTools.ImageFormat.Jpg;

                creator.CopyMetadata = false;
                creator.Create(OUTPUT_DIRECTORY + "\\" + newOutputFileName,
                    DEEPZOOM_OUTPUT_DIRECTORY + "\\" + USER_COUNT + "\\dzc_output.xml");

                //UploadResult result = new UploadResult()
                //{
                //    UploadResultCode = UploadResultCodeEnum.Success,
                //    Detail = (DEEPZOOM_URL + USER_COUNT)
                //};

                // return OK if we made it this far
                return DEEPZOOM_URL + USER_COUNT;



            //string ret = "";        // 반환할 문자열
            //string upDir = "";      // 업로드할 파일 저장 위치
            //string fName = "";      // 업로드된 실제 파일명
            //string fFullName = "";  // 저장할 파일의 풀 경로
            //string fExt = "";       // 파일의 확장자명
            //string fRealName = "";  // 파일의 확장자를 뺀 실제 파일명
            //string newFileName = "";// 새로 만들어질 파일명

            //int findex = 0; // 파일의 인덱스번호

            //System.IO.DirectoryInfo di = null;
            //System.IO.FileInfo fInfo = null;

            //// 파일이 있나?
            //if (FileUp.HasFile == true)
            //{
            //    // 저장할 경로
            //    upDir = UPLOAD_FOLDER;

            //    // 경로에 디렉토리가 없으면 만든다.
            //    di = new System.IO.DirectoryInfo(upDir); // 디렉토리를 다룰 연장
            //    if (di.Exists == false)
            //        di.Create();

            //    // 업로드 된 파일을 가지고 저장할 파일의 풀 경로를 만들어낸다.
            //    fName = FileUp.FileName;
            //    fFullName = upDir + fName;
            //    fInfo = new System.IO.FileInfo(fFullName); // 파일을 다룰 연장

            //    // 이미 해당하는 파일이 있으면
            //    if (fInfo.Exists == true)
            //    {
            //        fExt = fInfo.Extension;
            //        fRealName = fName.Replace(fExt, "");

            //        // 루프를 돌면서 실제 저장될 파일명을 결정한다.
            //        do
            //        {
            //            findex++;
            //            newFileName = fRealName + "_" + findex.ToString() + fExt;
            //            fInfo = new System.IO.FileInfo(upDir + newFileName);
            //        } while (fInfo.Exists);

            //        fFullName = upDir + newFileName;
            //        fName = newFileName;
            //    }

            //    FileUp.PostedFile.SaveAs(fFullName);
            //    fInfo = new System.IO.FileInfo(fFullName);

            //    ret = "../upload/" + fName;
            //}

            //return ret;
        }

        /*
         * public UploadResult UploadFile(byte[] file, string fileName, int themeCode)
        {
            string savedDir = "D:\\sourcecode\\codeplex\\SmartMosaic\\SmartMosaicServer\\UploadData\\index.txt";

            int USER_COUNT = 0;

            lock(GetType()) 
            {
                if (!File.Exists(savedDir))
                {
                    FileStream fs = File.Create(savedDir);

                    fs.Close();
                    fs.Dispose();
                }

                StreamReader sr = File.OpenText(savedDir);

                USER_COUNT = Convert.ToInt32(sr.ReadLine());
                USER_COUNT++;

                sr.Close();
                sr.Dispose();

                File.WriteAllText(savedDir, USER_COUNT.ToString());
            }

            // the byte array argument contains the content of the file
            // the string argument contains the name and extension
            // of the file passed in the byte array
            try
            {
                string newInputFileName = USER_COUNT + "" + themeCode + ".jpg";
                string newOutputFileName = USER_COUNT + ".jpg";
                string endOutputFileName = USER_COUNT + ".dat";

                // instance a memory stream and pass the
                // byte array to its constructor
                MemoryStream ms = new MemoryStream(file);

                // instance a filestream pointing to the 
                // storage folder, use the original file name
                // to name the resulting file
                FileStream fs = new FileStream
                    (INPUT_DIRECTORY + "\\" + newInputFileName, FileMode.Create);

                // write the memory stream containing the original
                // file as a byte array to the filestream
                ms.WriteTo(fs);

                // clean up
                ms.Close();
                fs.Close();
                fs.Dispose();

                // 여기서 파일 모니터하면 된다.
                while (!File.Exists(OUTPUT_DIRECTORY + "\\" + endOutputFileName))
                {
                    // 1초에 한번씩 체크
                    System.Threading.Thread.Sleep(1000);
                }
                
                // 파일이 생성된 경우
                // DeepZoomAPI 수행
                ImageCreator creator = new ImageCreator();
                creator.TileSize = 256;
                creator.TileFormat = Microsoft.DeepZoomTools.ImageFormat.Jpg;

                creator.CopyMetadata = false;
                creator.Create(OUTPUT_DIRECTORY + "\\" + newOutputFileName,
                    DEEPZOOM_OUTPUT_DIRECTORY + "\\" + USER_COUNT + "\\dzc_output.xml");

                UploadResult result = new UploadResult()
                {
                    UploadResultCode = UploadResultCodeEnum.Success,
                    Detail = (DEEPZOOM_URL + USER_COUNT)
                };

                // return OK if we made it this far
                return result;
            }
            catch (Exception ex)
            {
                // return the error message if the operation fails
                return new UploadResult()
                {
                    UploadResultCode = UploadResultCodeEnum.Fail,
                    Detail = ex.Message.ToString()
                }; ;
            }
        }
         */

        /// <summary>
        /// 이미지를 업로드 한 후 저장된 파일 경로를 반환한다.
        /// </summary>
        /// <param name="FileUp">업로드 컨트롤</param>
        /// <returns></returns>
        public string ImageUpload(FileUpload FileUp)
        {
            string ret = "";        // 반환할 문자열
            string upDir = "";      // 업로드할 파일 저장 위치
            string fName = "";      // 업로드된 실제 파일명
            string fFullName = "";  // 저장할 파일의 풀 경로
            string fExt = "";       // 파일의 확장자명
            string fRealName = "";  // 파일의 확장자를 뺀 실제 파일명
            string newFileName = "";// 새로 만들어질 파일명

            int findex = 0; // 파일의 인덱스번호

            System.IO.DirectoryInfo di = null;
            System.IO.FileInfo fInfo = null;

            // 파일이 있나?
            if (FileUp.HasFile == true)
            {
                // 저장할 경로
                upDir = UPLOAD_FOLDER;

                // 경로에 디렉토리가 없으면 만든다.
                di = new System.IO.DirectoryInfo(upDir); // 디렉토리를 다룰 연장
                if (di.Exists == false)
                    di.Create();

                // 업로드 된 파일을 가지고 저장할 파일의 풀 경로를 만들어낸다.
                fName = FileUp.FileName;
                fFullName = upDir + fName;
                fInfo = new System.IO.FileInfo(fFullName); // 파일을 다룰 연장

                // 이미 해당하는 파일이 있으면
                if (fInfo.Exists == true)
                {
                    fExt = fInfo.Extension;
                    fRealName = fName.Replace(fExt, "");

                    // 루프를 돌면서 실제 저장될 파일명을 결정한다.
                    do
                    {
                        findex++;
                        newFileName = fRealName + "_" + findex.ToString() + fExt;
                        fInfo = new System.IO.FileInfo(upDir + newFileName);
                    } while (fInfo.Exists);

                    fFullName = upDir + newFileName;
                    fName = newFileName;
                }

                FileUp.PostedFile.SaveAs(fFullName);
                fInfo = new System.IO.FileInfo(fFullName);

                ret = "../upload/" + fName;
            }

            return ret;
        }
    }
}
